package bom.example.common.redis.demo;

/**
 * @author Xiongx
 * @version 1.0
 * @date 2021/4/28 17:20
 * @since JDK 1.8
 */

import com.example.demo.domain.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 指定默认缓存区
 * 缓存区：key的前缀，与指定的key构成redis的key，如 user::10001
 */
@CacheConfig(cacheNames = "demo")
@Service
public class RedisCacheDemo {

    @Autowired
    private UserService userService;


    /**
     * @Cacheable 缓存有数据时，从缓存获取；没有数据时，执行方法，并将返回值保存到缓存中
     * @Cacheable 一般在查询中使用
     * 1) cacheNames 指定缓存区，没有配置使用@CacheConfig指定的缓存区
     * 2) key 指定缓存区的key
     * 3) 注解的值使用SpEL表达式
     * eq ==
     * lt <
     * le <=
     * gt >
     * ge >=
     */
    @Cacheable(cacheNames = "User", key = "#id")
    public User selectUFileById(String id) {
        return userService.getById(id);
    }

    @Cacheable(key="'list'")
    public List<User> selectUFileList() {
        return userService.list();
    }

    /**
     * condition 满足条件缓存数据
     */
    @Cacheable(key = "#id", condition = "#number ge 20") // >= 20
    public User selectUserByIdWithCondition(String id, int number) {
        return userService.getById(id);
    }

    /**
     * unless 满足条件时否决缓存数据
     */
    @Cacheable(key = "#id", unless = "#number lt 20") // < 20
    public User selectUserByIdWithUnless(String id, int number) {
        return userService.getById(id);
    }

    /**
     　　　* @CachePut 一定会执行方法，并将返回值保存到缓存中
     * @CachePut 一般在新增和修改中使用
     */
    @CachePut(key = "#uFile.id")
    public User insertUser(User uFile) {
        userService.save(uFile);
        return uFile;
    }

    @CachePut(key = "#uFile.id", condition = "#user.age ge 20")
    public User insertUserWithCondition(User uFile) {
        userService.save(uFile);
        return uFile;
    }

    @CachePut(key = "#uFile.id")
    public User updateUser(User uFile) {
        userService.updateById(uFile);
        return uFile;
    }

    /**
     * 根据key删除缓存区中的数据
     */
    @CacheEvict(key = "#id")
    public void deleteUserById(String id) {
        userService.removeById(id);
    }

    /**
     * allEntries = true ：删除整个缓存区的所有值，此时指定的key无效
     * beforeInvocation = true ：默认false，表示调用方法之后删除缓存数据；true时，在调用之前删除缓存数据(如方法出现异常)
     */
    @CacheEvict(key = "#id", allEntries = true)
    public void deleteUserByIdAndCleanCache(String id) {
        userService.removeById(id);
    }



}
